Virtual operating environments are used for a wide variety of purposes. Software operating in such environments may request access to devices for the same purposes as software running in any other type of computing environment. However, in the virtualization context, the devices requested in this manner may not actually be resident on the computing system, but may themselves be virtualized. Therefore, it is desirable to virtualize such devices in a manner that uses computing resources efficiently, and provides for reasonable software development costs.